package 变长滑动窗口1

func maximumUniqueSubarray(nums []int) (ans int) {
	diff := map[int]int{}
	n := len(nums)
	sum, left := 0, 0
	for i := 0; i < n; i++ {
		sum += nums[i]
		diff[nums[i]]++

		// 核心修复：若当前元素重复（计数>1），循环收缩窗口直到无重复
		for diff[nums[i]] > 1 {
			leftN := nums[left]
			sum -= leftN          // 从窗口和中减去左边界元素
			diff[leftN]--         // 减少左边界元素的计数
			if diff[leftN] == 0 { // 若计数为0，从哈希表中删除（可选，优化判断效率）
				delete(diff, leftN)
			}
			left++ // 左指针右移，缩小窗口
		}
		ans = max(ans, sum)
	}
	return
}

//func maximumUniqueSubarray(nums []int) (ans int) {
//	mx := slices.Max(nums)
//	has := make([]bool, mx+1)
//	s, left := 0, 0
//	for _, x := range nums {
//		for has[x] {
//			has[nums[left]] = false
//			s -= nums[left]
//			left++
//		}
//		has[x] = true
//		s += x
//		ans = max(ans, s)
//	}
//	return
//}
//
//作者：灵茶山艾府
//链接：https://leetcode.cn/problems/maximum-erasure-value/solutions/3720052/hua-dong-chuang-kou-bu-er-shu-zu-ha-xi-j-rsvy/
//来源：力扣（LeetCode）
//著作权归作者所有。商业转载请联系作者获得授权，非商业转载请注明出处。
